package com.ww.java8.fp.lambda;

/**
 * Dog有三个构造函数，函数式接口内的make()方法反映了构造函数参数列表，三个构造函数只有一个相同名称::new，但在每种情况下赋值给不同的接口，
 * 编译器可以从中知道具体使用哪个构造函数。
 *
 * @author wanggw
 * @date 2022-11-17 23:58:12
 */
public class CtorReference {
    public static void main(String[] args) {
        MakeNoArgs mna = Dog::new;
        Make1Arg m1a = Dog::new;
        Make2Args m2a = Dog::new;

        Dog dn = mna.make();
        Dog d1 = m1a.make("Comet");
        Dog d2 = m2a.make("Ralph", 4);
    }
}

class Dog {
    String name;
    int age = -1;

    Dog() {
        name = "stray";
    }

    Dog(String nm) {
        name = nm;
    }

    Dog(String nm, int yrs) {
        name = nm;
        age = yrs;
    }
}

interface MakeNoArgs {
    Dog make();
}

interface Make1Arg {
    Dog make(String nm);
}

interface Make2Args {
    Dog make(String nm, int age);
}